program _grepeat 
*! 1.0.0  NJC 21 July 2003 
	version 8.0
	gettoken type 0 : 0
	gettoken g 0 : 0
	gettoken eqs 0 : 0
	gettoken lparen 0 : 0, parse("(")
	gettoken rparen 0 : 0, parse(")")

	syntax [if] [in] , Values(str asis) [ by(varlist) Block(int 1) ]
	
	if `block' < 1 {
		di as err "block should be at least 1"
		exit 498
	}

	marksample touse
	tempvar order obs which  
	qui { 
		gen long `order' = _n 
		bysort `touse' `by' (`order') : /// 
			gen long `obs' = _n if `touse' 
	
		capture numlist "`values'"
		local isstr = _rc  
		// ignore user type 
		if `isstr' { 
			gen `g' = "" 
			local nvals : word count `values' 
			tokenize `"`values'"' 
		} 
		else { 
			gen double `g' = .
			local nvals : word count `r(numlist)' 
			tokenize "`r(numlist)'" 
		} 
		
		gen long `which' = 1 + int(mod((`obs' - 1) / `block', `nvals'))

		if `isstr' { 
			forval i = 1 / `nvals' { 
				replace `g' = "``i''" if `which' == `i'  
			}
		}	
		else { 	
			forval i = 1 / `nvals' { 
				replace `g' = ``i'' if `which' == `i' 
			} 	
			compress `g' 
		}
	}	
end 
